<?php

namespace X;

class Permiso
{
    // Verifica en Controller.init() si el usuario esta autenticado.
    public static function paraController(){

        if (\Zend_Session::namespaceIsset('Usuario') == false)
            // ErrorController maneja esta excepcion
            throw new \Exception('No está logueado.');
    }
    
    // Verifica en Controller.Action() si el usuario tiene asignado los 
    //   permisos (especificado por los parametros de la funcion).
    // Como son parametros dinamicos, obtenemos con func_get_args()
    public static function paraAction(){

        if (Permiso::privateAlMenosUna(func_get_args())) return;

        throw new \Exception('No tiene permiso para acceder a esta funcionalidad.');
    }
    
    // Ve si el usuario tiene asignado el permiso.
    public static function tiene($permiso){
        return Permiso::privateAlMenosUna(array($permiso));
    }
    
    //========== PRIVATE ===========//
    
    private static function privateAlMenosUna($args){
        $session = new \Zend_Session_Namespace('Usuario');
        foreach($args as $arg)
            if (isset($session->permisos_generales[$arg]))
                    return true;
        return false;
    }
    
    //========== DEBUG ===========//
    
    /*public static function debugRecargarPermisos(){

        // temporal
        $session = new \Zend_Session_Namespace('Usuario');
        $codigoUsuario = $session->codigoUsuario;

        // vaciar
        \Zend_Session::namespaceUnset('Usuario');
        
        // query
        $em = \Zend_Registry::getInstance()->entitymanager;
        
        $usuario = $em->createQueryBuilder()
                ->select   ('u')
                ->from     ('Default_Model_Usuario', 'u')
                ->where    ("u.codigoUsuario='$codigoUsuario'")
                ->getQuery ()
                ->getSingleResult();
            
        $permisos = $em->createQueryBuilder()
            ->select   ('f.nombreFuncionalidad')
            ->from     ('Default_Model_Usuario', 'u')
            ->join     ('u.perfil',   'p')
            ->join     ('p.funcionalidades',     'f')
            ->where    ("u.codigoUsuario='$codigoUsuario'")
            ->getQuery ()
            ->getResult();
        
        // reinstanciar
        $session = new \Zend_Session_Namespace('Usuario');            
        
        // asignar
        $session->username           = $usuario->getUsername();
        $session->codigoUsuario      = $usuario->getCodigoUsuario();
        $session->codigoPerfil       = $usuario->getPerfil()->getCodigoPerfil();
        $session->nombrePerfil       = $usuario->getPerfil()->getNombrePerfil();
        $session->codigoDepartamento = $usuario->getDepartamento()->getCodigoDepartamento();
        $session->nombreDepartamento = $usuario->getDepartamento()->getNombreDepartamento();
        
        foreach($permisos as $permiso){
            $session->__set($permiso['nombreFuncionalidad'], true);
        }
    }*/
}